#include <kernel.h>

#ifdef USE_WORK_QUEUE
#include <thread.h>
#include <units/work_queue.h>
#endif

extern void borad_init(void);

static void init_start(void) {
}
INIT_EXPORT(init_start, "0");

static void init_end(void) {
}
INIT_EXPORT(init_end, "3.end");

void system_init(void)
{
	volatile const init_fn_t *fn_ptr;

	for (fn_ptr = &__init_init_start; fn_ptr < &__init_init_end; fn_ptr++) {
		(*fn_ptr)();
	}
}

#ifdef USE_WORK_QUEUE
void main_entry(void *parameter)
{
	extern int main(void);

	main();
}
#endif

int entry(void)
{
#ifndef USE_WORK_QUEUE
	extern int main(void);
#endif

	int ret = 0;
	struct thread *thread;

	/* 板子初始化 */
	borad_init();

	schedule_init();

	/* 执行所有自动初始化函数 */
	system_init();

#ifdef USE_WORK_QUEUE
	thread = thread_creat("main", main_entry, NULL, MAIN_STACK_SIZE, MAIN_PRIO);
	thread_start(thread);

	work_queue_init();

	schedule_start();
#else
	ret = main();
#endif

	return ret;
}
